import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_house_manager/api/user.dart';
import 'package:flutter_house_manager/utils/Emitter.dart';
import 'package:flutter_house_manager/utils/PromptAction.dart';
import 'package:flutter_house_manager/utils/TokenManager.dart';

class LoginPage extends StatefulWidget {
  const LoginPage({super.key, this.toName});

  final String? toName;

  @override
  State<LoginPage> createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  int count = 60; // 倒计时总共秒数

  Timer? timer;
  bool isSend = false; // 是否正在发送 同时只能发一个
// 开始倒计时方法
  void beginCount() async {
    // 要保证同时只能有一个发送验证码的请求 阀门控制
    if (isSend) {
      return; // 如果正在发送 就不让往下走了
    }
    if (phoneController.text.isEmpty) {
      PromptAction.showWarning("请输入手机号");
      return;
    }
    // 校验手机号是否满足规范
    if (!RegExp(r'^1[3-9]\d{9}$').hasMatch(phoneController.text)) {
      PromptAction.showWarning("请输入正确的手机号");
      return;
    }
    isSend = true;
    // 可以发送验证码了
    final res = await sendCodeAPI({
      "mobile": phoneController.text,
    });
    // 不要那么快的填入进去 延时
    // 类似于setTimeout
    Future.delayed(const Duration(seconds: 2), () {
      codeController.text = res["code"];
    });

    // PromptAction.showToast(res["code"]);

    if (count == 60) {
      // 才可以开始倒计时
      timer = Timer.periodic(const Duration(seconds: 1), (timer) {
        if (count == 0) {
          // 结束倒计时
          timer.cancel();
          count = 60;
          isSend = false; // 等到倒计时60秒结束之后 才可以发送
          setState(() {});
          return;
        }
        count--;
        setState(() {});
      });
    } else {
      PromptAction.showWarning("请等到60s结束再发送");
    }
  }

// 卸载事件中销毁定时器 否则会永远留在内存中
  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    timer?.cancel();
  }

  Widget getTimeShow() {
    if (count == 60) {
      return const Text('获取验证码');
    }
    return Text(
      '${count}s',
      style: const TextStyle(color: Colors.grey),
    );
  }

  // 声明一个controller绑定手机号的表单
  TextEditingController phoneController = TextEditingController(); // 绑定手机号表单的
  TextEditingController codeController = TextEditingController(); // 绑定验证表单

  // 登录方法
  login() async {
    // 1. 手机号和验证码不能为空
    if (phoneController.text.isEmpty || codeController.text.isEmpty) {
      PromptAction.showWarning("手机号和验证码不能为空");
      return;
    }
    // 2.校验手机号和验证码的格式满足正则表达式
    if (!RegExp(r'^1[3-9]\d{9}$').hasMatch(phoneController.text) ||
        !RegExp(r'^\d{6}$').hasMatch(codeController.text)) {
      PromptAction.showWarning("手机号或验证码格式不正确");
      return;
    }
    // 调用登录接口
    final res = await loginAPI({
      "mobile": phoneController.text,
      "code": codeController.text,
    });
    //
    // 存储token到全局状态 tokenManager
    await tokenManager.setToken(res["token"],
        refreshToken: res["refreshToken"]); // 写入了

    emitter.fire(LogSuccessEvent());
    PromptAction.showSuccess("登录成功");

    // 如果toName说明 有需要跳转的页面
    if (widget.toName != null) {
      Navigator.pushNamed(context, widget.toName!);
      return;
    }
    Navigator.pop(context); // 返回上一个页面
    // todo 应该跳转到想去的页面
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: const Text('登录'),
        backgroundColor: Colors.transparent,
        centerTitle: true,
      ),
      body: Container(
        padding: const EdgeInsets.all(20),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            const Row(
              children: [
                Text(
                  '登录',
                  style: TextStyle(
                    fontSize: 25,
                    fontWeight: FontWeight.bold,
                  ),
                )
              ],
            ),
            const SizedBox(height: 10),
            const Row(
              children: [
                Text(
                  '加入享+, 让生活更轻松',
                  style: TextStyle(fontSize: 15),
                )
              ],
            ),
            const SizedBox(height: 30),
            Row(
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                Expanded(
                  child: TextField(
                    controller: phoneController,
                    decoration: const InputDecoration(
                      labelText: '手机号',
                      hintText: '请输入手机号',
                    ),
                  ),
                ),
                ElevatedButton(
                  style: ElevatedButton.styleFrom(
                    backgroundColor: Colors.white,
                    shadowColor: Colors.transparent,
                    foregroundColor: const Color.fromARGB(255, 85, 145, 175),
                    minimumSize: const Size(100, 50),
                  ),
                  onPressed: () {
                    // 点击获取验证码
                    beginCount();
                  },
                  child: getTimeShow(),
                ),
              ],
            ),
            const SizedBox(height: 8),
            TextField(
              controller: codeController,
              decoration: const InputDecoration(
                labelText: '验证码',
                hintText: '请输入6位验证码',
              ),
            ),
            const SizedBox(height: 8),
            const Row(
              children: [
                Text(
                  '未注册手机号经验证后将自动登录',
                  style: TextStyle(fontSize: 12, color: Colors.grey),
                ),
              ],
            ),
            const SizedBox(height: 50),
            Row(
              children: [
                Expanded(
                  child: ElevatedButton(
                    style: ElevatedButton.styleFrom(
                      backgroundColor: const Color.fromARGB(255, 85, 145, 175),
                      minimumSize: const Size(100, 50),
                    ),
                    onPressed: () {
                      login();
                    },
                    child: const Text(
                      '登录',
                      style: TextStyle(
                        color: Colors.white,
                        fontSize: 20,
                      ),
                    ),
                  ),
                )
              ],
            )
          ],
        ),
      ),
    );
  }
}
